home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / GNU / GNUPLOTsrc.lha / show.c < prev    next >
C/C++ Source or Header  |  1996-01-22  |  39KB  |  1,550 lines

  1. #ifndef lint
  2. static char *RCSid = "$Id: show.c,v 1.24 1995/12/18 22:41:12 drd Exp $";
  3. #endif
  4.  
  5.  
  6. /* GNUPLOT - show.c */
  7. /*
  8.  * Copyright (C) 1986 - 1993   Thomas Williams, Colin Kelley
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted, 
  12.  * provided that the above copyright notice appear in all copies and 
  13.  * that both that copyright notice and this permission notice appear 
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the modified code.  Modifications are to be distributed 
  18.  * as patches to released version.
  19.  *  
  20.  * This software is provided "as is" without express or implied warranty.
  21.  * 
  22.  *
  23.  * AUTHORS
  24.  * 
  25.  *   Original Software:
  26.  *     Thomas Williams,  Colin Kelley.
  27.  * 
  28.  *   Gnuplot 2.0 additions:
  29.  *       Russell Lang, Dave Kotz, John Campbell.
  30.  *
  31.  *   Gnuplot 3.0 additions:
  32.  *       Gershon Elber and many others.
  33.  *
  34.  * 19 September 1992  Lawrence Crowl  (crowl@cs.orst.edu)
  35.  * Added user-specified bases for log scaling.
  36.  * 
  37.  * There is a mailing list for gnuplot users. Note, however, that the
  38.  * newsgroup 
  39.  *    comp.graphics.gnuplot 
  40.  * is identical to the mailing list (they
  41.  * both carry the same set of messages). We prefer that you read the
  42.  * messages through that newsgroup, to subscribing to the mailing list.
  43.  * (If you can read that newsgroup, and are already on the mailing list,
  44.  * please send a message info-gnuplot-request@dartmouth.edu, asking to be
  45.  * removed from the mailing list.)
  46.  *
  47.  * The address for mailing to list members is
  48.  *       info-gnuplot@dartmouth.edu
  49.  * and for mailing administrative requests is 
  50.  *       info-gnuplot-request@dartmouth.edu
  51.  * The mailing list for bug reports is 
  52.  *       bug-gnuplot@dartmouth.edu
  53.  * The list of those interested in beta-test versions is
  54.  *       info-gnuplot-beta@dartmouth.edu
  55.  */
  56.  
  57. #include <math.h>
  58. #include "plot.h"
  59. #include "setshow.h"
  60.  
  61. #define DEF_FORMAT   "%g"    /* default format for tic mark labels */
  62. #define SIGNIF (0.01)        /* less than one hundredth of a tic mark */
  63.  
  64.  
  65.  
  66. #if defined(unix)
  67. extern FILE *popen();
  68. #endif
  69.  
  70. /* input data, parsing variables */
  71.  
  72. extern TBOOLEAN is_3d_plot;
  73.  
  74. #ifdef _Windows
  75. extern FILE * open_printer();
  76. extern void close_printer();
  77. #endif
  78.  
  79.  
  80. #ifndef TIMEFMT
  81. #define TIMEFMT "%d/%m/%y,%H:%M"
  82. #endif
  83. /* format for date/time for reading time in datafile */
  84.  
  85.  
  86.  
  87. /******** Local functions ********/
  88.  
  89. static void show_style __P((char name[], enum PLOT_STYLE style));
  90. static void show_range __P((int axis, double min, double max, int autosc, char *text));
  91. static void show_zero __P((void));
  92. static void show_border __P((void));
  93. static void show_dgrid3d __P((void));
  94. static void show_offsets __P((void));
  95. static void show_samples __P((void));
  96. static void show_isosamples __P((void));
  97. static void show_output __P((void));
  98. static void show_view __P((void));
  99. static void show_size __P((void));
  100. static void show_origin __P((void));
  101. static void show_title __P((void));
  102. static void show_xyzlabel __P((char *name, label_struct *label));
  103. static void show_angles __P((void));
  104. static void show_boxwidth __P((void));
  105. static void show_bars __P((void));
  106. static void show_xzeroaxis __P((void));
  107. static void show_yzeroaxis __P((void));
  108. static void show_label __P((int tag));
  109. static void show_arrow __P((int tag));
  110. static void show_grid __P((void));
  111. static void show_key __P((void));
  112. static void show_keytitle __P((void));
  113. static void show_mtics __P((int mini, double freq, char *name));
  114. static void show_pointsize __P((void));
  115. static void show_encoding __P((void));
  116. static void show_polar __P((void));
  117. static void show_parametric __P((void));
  118. static void show_tics __P((int showx, int showy, int showz, int showx2, int showy2));
  119. static void show_ticdef __P((int tics, int axis, struct ticdef *tdef, char *text));
  120. static void show_term __P((void));
  121. static void show_plot __P((void));
  122. static void show_autoscale __P((void));
  123. static void show_clip __P((void));
  124. static void show_contour __P((void));
  125. static void show_mapping __P((void));
  126. static void show_format __P((void));
  127. static void show_logscale __P((void));
  128. static void show_variables __P((void));
  129. static void show_surface __P((void));
  130. static void show_hidden3d __P((void));
  131. static void show_label_contours __P((void));
  132. static void show_margin __P((void));
  133. static void show_position __P((struct position *pos));
  134.  
  135. static TBOOLEAN show_one __P((void));
  136. static TBOOLEAN show_two __P((void));
  137. static void show_timefmt __P((void));
  138. static void show_locale __P((void));
  139. static void show_missing __P((void));
  140. static void show_datatype __P((int axis));
  141. static void show_locale __P((void));
  142.  
  143. /* following code segment appears over and over again */
  144.  
  145. #define SHOW_NUM_OR_TIME(x, axis) \
  146. do{if (datatype[axis]==TIME) { \
  147.   char s[80]; char *p; \
  148.   putc('\t', stderr);   \
  149.   gstrftime(s,80,timefmt,(double)x); \
  150.   for(p=s; *p; ++p) {\
  151.    if ( *p == '\t' ) fprintf(stderr,"\\t");\
  152.    else if ( *p > 126 || *p < 32 ) fprintf(stderr,"\\%o",*p);\
  153.    else putc(*p, stderr);\
  154.   }\
  155.   putc('"', stderr);\
  156.  } else {\
  157.   fprintf(stderr,"%g",x);\
  158. }} while(0)
  159.  
  160.  
  161. /******* The 'show' command *******/
  162. void
  163. show_command()
  164. {
  165.     static char GPFAR showmess[] = "valid show options:\n\
  166. \t'action_table', 'all', 'angles', 'arrow', 'autoscale', 'border',\n\
  167. \t'boxwidth', 'clip', 'contour', 'data', 'dgrid3d', 'dummy', 'encoding',\n\
  168. \t'format', 'function', 'grid', 'hidden', 'key', 'label', 'locale',\n\
  169. \t'logscale', 'mapping', 'margin', 'missing', 'offsets', 'origin',\n\
  170. \t'output', 'plot', 'parametric', 'pointsize', 'polar', '[rtuv]range',\n\
  171. \t'{iso}samples', 'size', 'terminal', 'tics', 'time', 'timefmt', 'title',\n\
  172. \t'variables', 'version', 'view', '[xyz]{2}label', '[xyz]{2}range',\n\
  173. \t'[xyz]{2}{m}tics', '[xyz]{2}[md]tics', '[xyz]{2}zeroaxis','[xyz]data',\n\
  174. \t'zero', 'zeroaxis'";
  175.  
  176.     c_token++;
  177.  
  178.     if (!show_one() && !show_two())
  179.     int_error(showmess, c_token);
  180.     screen_ok = FALSE;
  181.     (void) putc('\n',stderr);
  182. }
  183.  
  184. /* return TRUE if a command match, FALSE if not */
  185. static TBOOLEAN
  186. show_one()
  187. {
  188.     if (almost_equals(c_token,"ac$tion_table") ||
  189.              equals(c_token,"at") ) {
  190.         c_token++; 
  191.         show_at();
  192.         c_token++;
  193.     }
  194.     else if (almost_equals(c_token,"ar$row")) {
  195.         struct value a;
  196.         int tag = 0;
  197.  
  198.         c_token++;
  199.         if (!END_OF_COMMAND) {
  200.            tag = (int)real(const_express(&a));
  201.            if (tag <= 0)
  202.             int_error("tag must be > zero", c_token);
  203.         }
  204.  
  205.         (void) putc('\n',stderr);
  206.         show_arrow(tag);
  207.     }
  208.     else if (almost_equals(c_token,"au$toscale")) {
  209.         (void) putc('\n',stderr);
  210.         show_autoscale();
  211.         c_token++;
  212.     }
  213.         else if (almost_equals(c_token,"b$ars")){
  214.            (void) putc('\n',stderr);
  215.            show_bars();
  216.            c_token++;
  217.         }
  218.     else if (almost_equals(c_token,"bor$der")) {
  219.         (void) putc('\n',stderr);
  220.         show_border();
  221.         c_token++;
  222.     }
  223.     else if (almost_equals(c_token,"box$width")) {
  224.         (void) putc('\n',stderr);
  225.         show_boxwidth();
  226.         c_token++;
  227.     }
  228.     else if (almost_equals(c_token,"c$lip")) {
  229.         (void) putc('\n',stderr);
  230.         show_clip();
  231.         c_token++;
  232.     }
  233.     else if (almost_equals(c_token,"ma$pping")) {
  234.         (void) putc('\n',stderr);
  235.         show_mapping();
  236.         c_token++;
  237.     }
  238.     else if (almost_equals(c_token,"co$ntour")) {
  239.         (void) putc('\n',stderr);
  240.         show_contour();
  241.         c_token++;
  242.     }
  243.     else if (almost_equals(c_token,"da$ta")) {
  244.         c_token++;
  245.         if (!almost_equals(c_token,"s$tyle"))
  246.             int_error("expecting keyword 'style'",c_token);
  247.         (void) putc('\n',stderr);
  248.         show_style("data",data_style);
  249.         c_token++;
  250.     }
  251.     else if (almost_equals(c_token,"dg$rid3d")) {
  252.         (void) putc('\n',stderr);
  253.         show_dgrid3d();
  254.         c_token++;
  255.     }
  256.     else if (almost_equals(c_token,"du$mmy")) {
  257.           (void) fprintf(stderr,"\n\tdummy variables are \"%s\" and \"%s\"\n",
  258.                         dummy_var[0], dummy_var[1]);
  259.         c_token++;
  260.     }
  261.     else if (almost_equals(c_token,"fo$rmat")) {
  262.         show_format();
  263.         c_token++;
  264.     }
  265.     else if (almost_equals(c_token,"fu$nctions")) {
  266.         c_token++;
  267.         if (almost_equals(c_token,"s$tyle"))  {
  268.             (void) putc('\n',stderr);
  269.             show_style("functions",func_style);
  270.             c_token++;
  271.         }
  272.         else
  273.             show_functions();
  274.     }
  275.     else if (almost_equals(c_token,"lo$gscale")) {
  276.         (void) putc('\n',stderr);
  277.         show_logscale();
  278.         c_token++;
  279.     }
  280.     else if (almost_equals(c_token,"of$fsets")) {
  281.         (void) putc('\n',stderr);
  282.         show_offsets();
  283.         c_token++;
  284.     }
  285.     else if (almost_equals(c_token,"ma$rgin")) {
  286.         (void) putc('\n',stderr);
  287.         show_margin();
  288.         c_token++;
  289.     }
  290.     else if (almost_equals(c_token,"o$utput")) {
  291.         (void) putc('\n',stderr);
  292.         show_output();
  293.         c_token++;
  294.     }
  295.     else if (almost_equals(c_token,"tit$le")) {
  296.         (void) putc('\n',stderr);
  297.         show_title();
  298.         c_token++;
  299.     }
  300.     else if (almost_equals(c_token,"mis$sing")) {
  301.         (void) putc('\n',stderr);
  302.         show_missing();
  303.         c_token++;
  304.     }
  305.     else if (almost_equals(c_token,"xl$abel")) {
  306.         (void) putc('\n',stderr);
  307.         show_xyzlabel("xlabel", &xlabel);
  308.         c_token++;
  309.     }
  310.     else if (almost_equals(c_token,"x2l$abel")) {
  311.         (void) putc('\n',stderr);
  312.         show_xyzlabel("x2label", &x2label);
  313.         c_token++;
  314.     }
  315.     else if (almost_equals(c_token,"yl$abel")) {
  316.         (void) putc('\n',stderr);
  317.         show_xyzlabel("ylabel", &ylabel);
  318.         c_token++;
  319.     }
  320.     else if (almost_equals(c_token,"y2l$abel")) {
  321.         (void) putc('\n',stderr);
  322.         show_xyzlabel("y2label", &y2label);
  323.         c_token++;
  324.     }
  325.     else if (almost_equals(c_token,"zl$abel")) {
  326.         (void) putc('\n',stderr);
  327.         show_xyzlabel("zlabel", &zlabel);
  328.         c_token++;
  329.     }
  330.     else if (almost_equals(c_token,"keyt$itle")) {
  331.         (void) putc('\n',stderr);
  332.         show_keytitle();
  333.         c_token++;
  334.     }
  335.     else if (almost_equals(c_token,"xda$ta")) {
  336.         (void) putc('\n',stderr);
  337.         show_datatype(FIRST_X_AXIS);
  338.         c_token++;
  339.     }
  340.     else if (almost_equals(c_token,"yda$ta")) {
  341.         (void) putc('\n',stderr);
  342.         show_datatype(FIRST_Y_AXIS);
  343.         c_token++;
  344.     }
  345.     else if (almost_equals(c_token,"x2da$ta")) {
  346.         (void) putc('\n',stderr);
  347.         show_datatype(SECOND_X_AXIS);
  348.         c_token++;
  349.     }
  350.     else if (almost_equals(c_token,"y2da$ta")) {
  351.         (void) putc('\n',stderr);
  352.         show_datatype(SECOND_Y_AXIS);
  353.         c_token++;
  354.     }
  355.     else if (almost_equals(c_token,"zda$ta")) {
  356.         (void) putc('\n',stderr);
  357.         show_datatype(FIRST_Z_AXIS);
  358.         c_token++;
  359.     }
  360.     else if (almost_equals(c_token,"timef$mt")) {
  361.         (void) putc('\n',stderr);
  362.         show_timefmt();
  363.         c_token++;
  364.     }
  365.     else if (almost_equals(c_token,"loca$le")) {
  366.         (void) putc('\n',stderr);
  367.         show_locale();
  368.         c_token++;
  369.     }
  370.     else if (almost_equals(c_token,"xzero$axis")) {
  371.         (void) putc('\n',stderr);
  372.         show_xzeroaxis();
  373.         c_token++;
  374.     }
  375.     else if (almost_equals(c_token,"yzero$axis")) {
  376.         (void) putc('\n',stderr);
  377.         show_yzeroaxis();
  378.         c_token++;
  379.     }
  380.     else if (almost_equals(c_token,"zeroa$xis")) {
  381.         (void) putc('\n',stderr);
  382.         show_xzeroaxis();
  383.         show_yzeroaxis();
  384.         c_token++;
  385.     }
  386.     else if (almost_equals(c_token,"la$bel")) {
  387.         struct value a;
  388.         int tag = 0;
  389.  
  390.         c_token++;
  391.         if (!END_OF_COMMAND) {
  392.            tag = (int)real(const_express(&a));
  393.            if (tag <= 0)
  394.             int_error("tag must be > zero", c_token);
  395.         }
  396.  
  397.         (void) putc('\n',stderr);
  398.         show_label(tag);
  399.     }
  400.     else if (almost_equals(c_token,"g$rid")) {
  401.         (void) putc('\n',stderr);
  402.         show_grid();
  403.         c_token++;
  404.     }
  405.         else if (almost_equals(c_token,"mxt$ics")) {
  406.                 (void) putc('\n',stderr);
  407.                 show_mtics(mxtics, mxtfreq, "x");
  408.                 c_token++;
  409.         }
  410.         else if (almost_equals(c_token,"myt$ics")) {
  411.                 (void) putc('\n',stderr);
  412.                 show_mtics(mytics, mytfreq, "y");
  413.                 c_token++;
  414.         }
  415.        else if (almost_equals(c_token,"mzt$ics")) {
  416.                 (void) putc('\n',stderr);
  417.                 show_mtics(mztics, mztfreq, "z");
  418.                 c_token++;
  419.         }
  420.        else if (almost_equals(c_token,"mx2t$ics")) {
  421.                 (void) putc('\n',stderr);
  422.                 show_mtics(mx2tics, mx2tfreq, "x2");
  423.                 c_token++;
  424.         }
  425.        else if (almost_equals(c_token,"my2t$ics")) {
  426.                 (void) putc('\n',stderr);
  427.                 show_mtics(my2tics, my2tfreq, "y2");
  428.                 c_token++;
  429.         }
  430.     else if (almost_equals(c_token,"k$ey")) {
  431.         (void) putc('\n',stderr);
  432.         show_key();
  433.         c_token++;
  434.     }
  435.     else
  436.         return (FALSE);
  437.     return TRUE;
  438. }
  439.  
  440. /* return TRUE if a command match, FALSE if not */
  441. static TBOOLEAN
  442. show_two()
  443. {
  444.     if (almost_equals(c_token,"p$lot")) {
  445.         (void) putc('\n',stderr);
  446.         show_plot();
  447.         c_token++;
  448.     }
  449.     else if (almost_equals(c_token,"par$ametric")) {
  450.         (void) putc('\n',stderr);
  451.         show_parametric();
  452.         c_token++;
  453.     }
  454.     else if (almost_equals(c_token, "poi$ntsize")) {
  455.         (void) putc('\n', stderr);
  456.         show_pointsize();
  457.         c_token++;
  458.     }
  459.     else if (almost_equals(c_token, "enc$oding")) {
  460.         (void) putc('\n', stderr);
  461.         show_encoding();
  462.         c_token++;
  463.     }
  464.     else if (almost_equals(c_token,"pol$ar")) {
  465.         (void) putc('\n',stderr);
  466.         show_polar();
  467.         c_token++;
  468.     }
  469.     else if (almost_equals(c_token,"an$gles")) {
  470.         (void) putc('\n',stderr);
  471.         show_angles();
  472.         c_token++;
  473.     }
  474.     else if (almost_equals(c_token,"ti$cs")) {
  475.         (void) putc('\n',stderr);
  476.         show_tics(TRUE,TRUE,TRUE,TRUE,TRUE);
  477.         c_token++;
  478.     }
  479.     else if (almost_equals(c_token,"tim$e")) {
  480.         (void) putc('\n',stderr);
  481.         show_xyzlabel("time", &timelabel);
  482.         c_token++;
  483.     }
  484.     else if (almost_equals(c_token,"su$rface")) {
  485.         (void) putc('\n',stderr);
  486.         show_surface();
  487.         c_token++;
  488.     }
  489.     else if (almost_equals(c_token,"hi$dden3d")) {
  490.         (void) putc('\n',stderr);
  491.         show_hidden3d();
  492.         c_token++;
  493.     }
  494.      else if (almost_equals(c_token,"cla$bel")) {
  495.          (void) putc('\n',stderr);
  496.          show_label_contours();
  497.          c_token++;
  498.      }
  499.     else if (almost_equals(c_token,"xti$cs")) {
  500.         show_tics(TRUE,FALSE,FALSE,TRUE,FALSE);
  501.         c_token++;
  502.     }
  503.     else if (almost_equals(c_token,"yti$cs")) {
  504.         show_tics(FALSE,TRUE,FALSE,FALSE,TRUE);
  505.         c_token++;
  506.     }
  507.     else if (almost_equals(c_token,"zti$cs")) {
  508.         show_tics(FALSE,FALSE,TRUE,FALSE, FALSE);
  509.         c_token++;
  510.     }
  511.     else if (almost_equals(c_token,"x2ti$cs")) {
  512.         show_tics(FALSE,FALSE,FALSE,TRUE,FALSE);
  513.         c_token++;
  514.     }
  515.     else if (almost_equals(c_token,"y2ti$cs")) {
  516.         show_tics(FALSE,FALSE,FALSE,FALSE,TRUE);
  517.         c_token++;
  518.     }
  519.     else if (almost_equals(c_token,"sa$mples")) {
  520.         (void) putc('\n',stderr);
  521.         show_samples();
  522.         c_token++;
  523.     }
  524.     else if (almost_equals(c_token,"isosa$mples")) {
  525.         (void) putc('\n',stderr);
  526.         show_isosamples();
  527.         c_token++;
  528.     }
  529.     else if (almost_equals(c_token,"si$ze")) {
  530.         (void) putc('\n',stderr);
  531.         show_size();
  532.         c_token++;
  533.     }
  534.     else if (almost_equals(c_token,"orig$in")) {
  535.         (void) putc('\n',stderr);
  536.         show_origin();
  537.         c_token++;
  538.     }
  539.     else if (almost_equals(c_token,"t$erminal")) {
  540.         (void) putc('\n',stderr);
  541.         show_term();
  542.         c_token++;
  543.     }
  544.     else if (almost_equals(c_token,"rr$ange")) {
  545.         (void) putc('\n',stderr);
  546.         show_range(R_AXIS,rmin,rmax,autoscale_r, "r");
  547.         c_token++;
  548.     }
  549.     else if (almost_equals(c_token,"tr$ange")) {
  550.         (void) putc('\n',stderr);
  551.         show_range(T_AXIS,tmin,tmax,autoscale_t, "t");
  552.         c_token++;
  553.     }
  554.     else if (almost_equals(c_token,"ur$ange")) {
  555.         (void) putc('\n',stderr);
  556.         show_range(U_AXIS,umin,umax,autoscale_u, "u");
  557.         c_token++;
  558.     }
  559.     else if (almost_equals(c_token,"vi$ew")) {
  560.         (void) putc('\n',stderr);
  561.         show_view();
  562.         c_token++;
  563.     }
  564.     else if (almost_equals(c_token,"vr$ange")) {
  565.         (void) putc('\n',stderr);
  566.         show_range(V_AXIS,vmin,vmax,autoscale_v, "v");
  567.         c_token++;
  568.     }
  569.     else if (almost_equals(c_token,"v$ariables")) {
  570.         show_variables();
  571.         c_token++;
  572.     }
  573.     else if (almost_equals(c_token,"ve$rsion")) {
  574.         show_version();
  575.         c_token++;
  576.     }
  577.     else if (almost_equals(c_token,"xr$ange")) {
  578.         (void) putc('\n',stderr);
  579.         show_range(FIRST_X_AXIS,xmin,xmax,autoscale_x, "x");
  580.         c_token++;
  581.     }
  582.     else if (almost_equals(c_token,"yr$ange")) {
  583.         (void) putc('\n',stderr);
  584.         show_range(FIRST_Y_AXIS,ymin,ymax,autoscale_y, "y");
  585.         c_token++;
  586.     }
  587.     else if (almost_equals(c_token,"x2r$ange")) {
  588.         (void) putc('\n',stderr);
  589.         show_range(SECOND_X_AXIS,x2min,x2max,autoscale_x2, "x2");
  590.         c_token++;
  591.     }
  592.     else if (almost_equals(c_token,"y2r$ange")) {
  593.         (void) putc('\n',stderr);
  594.         show_range(SECOND_Y_AXIS,y2min,y2max,autoscale_y2, "y2");
  595.         c_token++;
  596.     }
  597.     else if (almost_equals(c_token,"zr$ange")) {
  598.         (void) putc('\n',stderr);
  599.         show_range(FIRST_Z_AXIS,zmin,zmax,autoscale_z, "z");
  600.         c_token++;
  601.     }
  602.     else if (almost_equals(c_token,"z$ero")) {
  603.         (void) putc('\n',stderr);
  604.         show_zero();
  605.         c_token++;
  606.     }
  607.     else if (almost_equals(c_token,"a$ll")) {
  608.         c_token++;
  609.         show_version();
  610.         show_autoscale();
  611.                 show_bars();
  612.         show_border();
  613.         show_boxwidth();
  614.         show_clip();
  615.         show_contour();
  616.         show_dgrid3d();
  617.         show_mapping();
  618.           (void) fprintf(stderr,"\tdummy variables are \"%s\" and \"%s\"\n",
  619.                         dummy_var[0], dummy_var[1]);
  620.         show_format();
  621.         show_style("data",data_style);
  622.         show_style("functions",func_style);
  623.         show_grid();
  624.         show_xzeroaxis();
  625.         show_yzeroaxis();
  626.         show_label(0);
  627.         show_arrow(0);
  628.         show_keytitle();
  629.         show_key();
  630.         show_logscale();
  631.         show_offsets();
  632.         show_margin();
  633.         show_output();
  634.         show_parametric();
  635.         show_pointsize();
  636.         show_encoding();
  637.         show_polar();
  638.         show_angles();
  639.         show_samples();
  640.         show_isosamples();
  641.         show_view();
  642.         show_surface();
  643. #ifndef LITE
  644.         show_hidden3d();
  645. #endif
  646.         show_size();
  647.         show_origin();
  648.         show_term();
  649.         show_tics(TRUE,TRUE,TRUE,TRUE,TRUE);
  650.                 show_mtics(mxtics, mxtfreq, "x");
  651.                 show_mtics(mytics, mytfreq, "y");
  652.                 show_mtics(mztics, mztfreq, "z");
  653.                 show_mtics(mx2tics, mx2tfreq, "x2");
  654.                 show_mtics(my2tics, my2tfreq, "y2");
  655.         show_xyzlabel("time", &timelabel);
  656.         if (parametric || polar)
  657.             if (!is_3d_plot)
  658.                 show_range(T_AXIS,tmin,tmax,autoscale_t, "t");
  659.             else {
  660.                 show_range(U_AXIS,umin,umax,autoscale_u, "u");
  661.                 show_range(V_AXIS,vmin,vmax,autoscale_v, "v");
  662.             }
  663.         show_range(FIRST_X_AXIS,xmin,xmax,autoscale_x, "x");
  664.         show_range(FIRST_Y_AXIS,ymin,ymax,autoscale_y, "y");
  665.         show_range(SECOND_X_AXIS,x2min,x2max,autoscale_x2, "x2");
  666.         show_range(SECOND_Y_AXIS,y2min,y2max,autoscale_y2, "y2");
  667.         show_range(FIRST_Z_AXIS,zmin,zmax,autoscale_z, "z");
  668.         show_xyzlabel("title", &title);
  669.         show_xyzlabel("xlabel", &xlabel);
  670.         show_xyzlabel("ylabel", &ylabel);
  671.         show_xyzlabel("zlabel", &zlabel);
  672.         show_xyzlabel("x2label", &x2label);
  673.         show_xyzlabel("y2label", &y2label);
  674.         /* show_datatype(9); - eh  ? */
  675.         show_timefmt();
  676.         show_locale();
  677.         show_zero();
  678.         show_missing();
  679.         show_plot();
  680.         show_variables();
  681.         show_functions();
  682.         c_token++;
  683.     }
  684.     else
  685.         return (FALSE);
  686.     return (TRUE);
  687. }
  688.  
  689.  
  690. /*********** support functions for 'show'  **********/
  691. /* perhaps these need to be put into a constant array ? */
  692. static void
  693. show_style(name,style)
  694. char name[];
  695. enum PLOT_STYLE style;
  696. {
  697.     fprintf(stderr,"\t%s are plotted with ",name);
  698.     switch (style) {
  699.         case LINES: fprintf(stderr,"lines\n"); break;
  700.         case POINTSTYLE: fprintf(stderr,"points\n"); break;
  701.         case IMPULSES: fprintf(stderr,"impulses\n"); break;
  702.         case LINESPOINTS: fprintf(stderr,"linespoints\n"); break;
  703.         case DOTS: fprintf(stderr,"dots\n"); break;
  704.                 case YERRORBARS: fprintf(stderr,"yerrorbars\n"); break;
  705.                 case XERRORBARS: fprintf(stderr,"xerrorbars\n"); break;
  706.                 case XYERRORBARS: fprintf(stderr,"xyerrorbars\n"); break;
  707.         case BOXES: fprintf(stderr,"boxes\n"); break;
  708.         case BOXERROR: fprintf(stderr,"boxerrorbars\n"); break;
  709.                 case BOXXYERROR: fprintf(stderr,"boxxyerrorbars\n"); break;
  710.         case STEPS: fprintf(stderr,"steps\n"); break;
  711.         case FSTEPS: fprintf(stderr,"fsteps\n"); break;
  712.                 case VECTOR: fprintf(stderr,"vector\n"); break;
  713.         }
  714. }
  715.  
  716. static void
  717. show_bars()
  718. {
  719.   if (bar_size > 0.0)
  720.     fprintf(stderr,"\terrorbars are plotted with bars of size %f\n", bar_size);
  721.   else
  722.    fprintf(stderr, "\terrors are plotted without bars\n");
  723. }
  724.  
  725. static void
  726. show_boxwidth()
  727. {
  728.     if (boxwidth<0.0)
  729.         fprintf(stderr,"\tboxwidth is auto\n");
  730.     else
  731.         fprintf(stderr,"\tboxwidth is %g\n",boxwidth);
  732. }
  733. static void
  734. show_dgrid3d()
  735. {
  736.     if (dgrid3d)
  737.         fprintf(stderr,"\tdata grid3d is enabled for mesh of size %dx%d, norm=%d\n",
  738.             dgrid3d_row_fineness,
  739.             dgrid3d_col_fineness,
  740.             dgrid3d_norm_value);
  741.     else
  742.         fprintf(stderr,"\tdata grid3d is disabled\n");
  743. }
  744.  
  745. #ifdef ANSI_C
  746. static void show_range(int axis,double min, double max, TBOOLEAN autosc, char *text)
  747. #else
  748. static void
  749. show_range(axis,min,max,autosc,text)
  750. int axis;
  751. double min,max;
  752. TBOOLEAN autosc;
  753. char *text;
  754. #endif
  755. {
  756.  
  757.     if ( datatype[axis] == TIME ) 
  758.         fprintf(stderr,"\tset %sdata time\n",text);
  759.     fprintf(stderr,"\tset %srange [",text);
  760.     if ( autosc & 1 ) {
  761.         fprintf(stderr,"*");
  762.     } else {
  763.         SHOW_NUM_OR_TIME(min, axis);
  764.     }
  765.     fprintf(stderr," : ");
  766.     if ( autosc & 2 ) {
  767.         fprintf(stderr,"*");
  768.     } else {
  769.         SHOW_NUM_OR_TIME(max, axis);
  770.     }
  771.     fprintf(stderr,"] %sreverse %swriteback\n",
  772.         range_flags[axis] & RANGE_REVERSE ? "" : "no",
  773.         range_flags[axis] & RANGE_WRITEBACK ? "" : "no");
  774. }
  775.  
  776. static void
  777. show_zero()
  778. {
  779.     fprintf(stderr,"\tzero is %g\n",zero);
  780. }
  781.  
  782. static void
  783. show_offsets()
  784. {
  785.     fprintf(stderr,"\toffsets are %g, %g, %g, %g\n",loff,roff,toff,boff);
  786. }
  787.  
  788. static void
  789. show_border()
  790. {
  791.     fprintf(stderr,"\tborder is %sdrawn %d\n", draw_border ? "" : "not ",
  792.         draw_border);
  793. }
  794.  
  795. static void
  796. show_output()
  797. {
  798.     fprintf(stderr,"\toutput is sent to %s\n",outstr);
  799. }
  800.  
  801. static void
  802. show_samples()
  803. {
  804.     fprintf(stderr,"\tsampling rate is %d, %d\n",samples_1, samples_2);
  805. }
  806.  
  807. static void
  808. show_isosamples()
  809. {
  810.     fprintf(stderr,"\tiso sampling rate is %d, %d\n",
  811.         iso_samples_1, iso_samples_2);
  812. }
  813.  
  814. static void
  815. show_surface()
  816. {
  817.     fprintf(stderr,"\tsurface is %sdrawn\n", draw_surface ? "" : "not ");
  818. }
  819.  
  820. static void
  821. show_hidden3d()
  822. {
  823. #ifdef LITE
  824.     printf(" Hidden Line Removal Not Supported in LITE version\n");
  825. #else
  826.     fprintf(stderr,"\thidden surface is %s\n", hidden3d ? "removed" : "drawn");
  827. #endif /* LITE */
  828. }
  829.  
  830. static void
  831. show_label_contours()
  832. {
  833.     if (label_contours)
  834.         fprintf(stderr,"\tcontour line types are varied & labeled with format '%s'\n", contour_format);
  835.     else
  836.         fprintf(stderr,"\tcontour line types are all the same\n");
  837. }
  838.  
  839. static void
  840. show_view()
  841. {
  842.     fprintf(stderr,"\tview is %g rot_x, %g rot_z, %g scale, %g scale_z\n",
  843.         surface_rot_x, surface_rot_z, surface_scale, surface_zscale);
  844. }
  845.  
  846. static void
  847. show_size()
  848. {
  849.     fprintf(stderr,"\tsize is scaled by %g,%g\n",xsize,ysize);
  850.     fprintf(stderr,"\t%s to set aspect ratio to 1\n", square?"Try":"No attempt");
  851. }
  852.  
  853. static void
  854. show_origin()
  855. {
  856.     fprintf(stderr,"\torigin is set to %g,%g\n",xoffset, yoffset);
  857. }
  858.  
  859. static void
  860. show_title()
  861. {
  862.     char str[MAX_LINE_LEN+1];
  863.     fprintf(stderr,"\ttitle is \"%s\", offset at %f, %f\n",
  864.         conv_text(str,title.text),title.xoffset,title.yoffset);
  865. }
  866.  
  867. static void
  868. show_xyzlabel(name, label)
  869. char *name;
  870. label_struct *label;
  871. {
  872.     char str[MAX_LINE_LEN+1];
  873.     fprintf(stderr,"\t%s is \"%s\", offset at %f, %f",
  874.         name, conv_text(str,label->text),label->xoffset,label->yoffset);
  875.     if (*label->font)
  876.         fprintf(stderr, ", using font \"%s\"", conv_text(str, label->font));
  877.     putc('\n', stderr);
  878. }
  879.  
  880. static void
  881. show_keytitle()
  882. {
  883.     char str[MAX_LINE_LEN+1];
  884.     fprintf(stderr,"\tkeytitle is \"%s\"\n",
  885.         conv_text(str,key_title));
  886. }
  887.  
  888. static void
  889. show_timefmt()
  890. {
  891.     char str[MAX_LINE_LEN+1];
  892.     fprintf(stderr,"\tread format for time is \"%s\"\n",
  893.         conv_text(str,timefmt));
  894. }
  895.  
  896. static void
  897. show_locale()
  898. {
  899.     fprintf(stderr,"\tlocale is \"%s\"\n", cur_locale);
  900. }
  901.  
  902. static void
  903. show_xzeroaxis()
  904. {
  905.     if (xzeroaxis > -3)
  906.         fprintf(stderr,"\txzeroaxis is drawn with line %d\n",xzeroaxis+1);
  907.     else
  908.         fputs("\txzeroaxis is OFF\n", stderr);
  909.     if (x2zeroaxis > -3)
  910.         fprintf(stderr,"\tx2zeroaxis is drawn with line %d\n",x2zeroaxis+1);
  911.     else
  912.         fputs("\tx2zeroaxis is OFF\n", stderr);
  913. }
  914.  
  915. static void
  916. show_yzeroaxis()
  917. {
  918.     if (yzeroaxis > -3)
  919.         fprintf(stderr,"\tyzeroaxis is drawn with line %d\n",yzeroaxis+1);
  920.     else
  921.         fputs("\tyzeroaxis is OFF\n", stderr);
  922.     if (y2zeroaxis > -3)
  923.         fprintf(stderr,"\ty2zeroaxis is drawn with line %d\n",y2zeroaxis+1);
  924.     else
  925.         fputs("\ty2zeroaxis is OFF\n", stderr);
  926. }
  927.  
  928. static void
  929. show_label(tag)
  930.     int tag;                /* 0 means show all */
  931. {
  932.     struct text_label *this_label;
  933.     TBOOLEAN showed = FALSE;
  934.     char str[MAX_LINE_LEN+1];
  935.  
  936.     for (this_label = first_label; this_label != NULL;
  937.         this_label = this_label->next) {
  938.        if (tag == 0 || tag == this_label->tag) {
  939.           showed = TRUE;
  940.           fprintf(stderr,"\tlabel %d \"%s\" at ",
  941.                 this_label->tag, conv_text(str,this_label->text));
  942.           show_position(&this_label->place);
  943.           switch(this_label->pos) {
  944.              case LEFT : {
  945.                 fprintf(stderr,"left");
  946.                 break;
  947.              }
  948.              case CENTRE : {
  949.                 fprintf(stderr,"centre");
  950.                 break;
  951.              }
  952.              case RIGHT : {
  953.                 fprintf(stderr,"right");
  954.                 break;
  955.              }
  956.           }
  957.           if ((this_label->font)[0]!='\0')
  958.                          fprintf(stderr," font \"%s\"",this_label->font);
  959.           /* Entry font added by DJL */
  960.           fputc('\n',stderr);
  961.        }
  962.     }
  963.     if (tag > 0 && !showed)
  964.      int_error("label not found", c_token);
  965. }
  966.  
  967. static void
  968. show_arrow(tag)
  969.     int tag;                /* 0 means show all */
  970. {
  971.     struct arrow_def *this_arrow;
  972.     TBOOLEAN showed = FALSE;
  973.  
  974.     for (this_arrow = first_arrow; this_arrow != NULL;
  975.         this_arrow = this_arrow->next) {
  976.        if (tag == 0 || tag == this_arrow->tag) {
  977.           showed = TRUE;
  978.           fprintf(stderr,"\tarrow %d, linetype %d %s\n\tfrom ",
  979.                 this_arrow->tag, 
  980.                 this_arrow->line,
  981.                 this_arrow->head ? "" : " (nohead)");
  982.             show_position(&this_arrow->start);
  983.             fputs(" to ", stderr);
  984.             show_position(&this_arrow->end);
  985.        }
  986.     }
  987.     if (tag > 0 && !showed)
  988.      int_error("arrow not found", c_token);
  989. }
  990.  
  991. static void
  992. show_grid()
  993. {
  994.     if (!grid) {
  995.         fputs("\tgrid is OFF\n", stderr);
  996.         return;
  997.     }
  998.  
  999.     fprintf(stderr, "\t%s grid drawn at%s%s%s%s%s%s%s%s%s%s tics\n",
  1000.       (polar_grid_angle != 0) ? "Polar" : "Rectangular",
  1001.       grid&GRID_X ? " x" : "",
  1002.       grid&GRID_Y ? " y" : "",
  1003.       grid&GRID_Z ? " z" : "",
  1004.       grid&GRID_X2 ? " x2" : "",
  1005.       grid&GRID_Y2 ? " y2" : "",
  1006.       grid&GRID_MX ? " mx" : "",
  1007.       grid&GRID_MY ? " my" : "",
  1008.       grid&GRID_MZ ? " mz" : "",
  1009.       grid&GRID_MX2 ? " mx2" : "",
  1010.       grid&GRID_MY2 ? " my2" : "");
  1011.  
  1012.     fprintf(stderr, "\tGrid drawn with linetype %d %d\n", grid_linetype+1, mgrid_linetype+1);
  1013.  
  1014.     if (polar_grid_angle)
  1015.         fprintf(stderr, "\tGrid radii drawn every %f %s\n",
  1016.            polar_grid_angle/ang2rad,
  1017.            angles_format==ANGLES_DEGREES ? "degrees" : "radians");
  1018. }
  1019.  
  1020. static void
  1021. show_mtics(minitic, minifreq, name)
  1022. int minitic;
  1023. double minifreq;
  1024. char *name;
  1025. {
  1026.    switch(minitic) {
  1027.       case MINI_OFF:
  1028.     fprintf(stderr, "\tminor %stics are off\n", name); break;
  1029.       case MINI_DEFAULT:
  1030.     fprintf(stderr, "\tminor %stics are computed automatically for log scales\n", name);
  1031.     break;
  1032.       case MINI_AUTO:
  1033.     fprintf(stderr, "\tminor %stics are computed automatically\n", name);
  1034.     break;
  1035.       case MINI_USER:
  1036.     fprintf(stderr,"\tminor %stics are drawn with %d subintervals between major xtic marks\n",name, (int) minifreq);
  1037.     break;
  1038.       default:
  1039.     int_error("Unknown minitic type in show_mtics()", NO_CARET);
  1040.    }
  1041. }
  1042.  
  1043. static void
  1044. show_key()
  1045. {
  1046.     char str[80];
  1047.     *str = '\0';
  1048.     switch (key) {
  1049.         case -1 : 
  1050.             if (key_vpos == TUNDER) {
  1051.                 strcpy(str,"below"); 
  1052.             } else if (key_vpos == TTOP ) {
  1053.                 strcpy(str,"top"); 
  1054.             } else {
  1055.                 strcpy(str,"bottom"); 
  1056.             }
  1057.             if (key_hpos == TOUT) {
  1058.                 strcpy(str,"outside (right)"); 
  1059.             } else if (key_hpos == TLEFT ) {
  1060.                 strcat(str," left"); 
  1061.             } else {
  1062.                 strcat(str," right"); 
  1063.             }
  1064.             if ( key_vpos != TUNDER && key_hpos != TOUT ) {
  1065.                 strcat(str," corner");
  1066.             }
  1067.             fprintf(stderr,"\tkey is ON, position: %s\n", str);
  1068.             break;
  1069.         case 0 :
  1070.             fprintf(stderr,"\tkey is OFF\n");
  1071.             break;
  1072.         case 1 :
  1073.             fprintf(stderr,"\tkey is at ");
  1074.             show_position(&key_user_pos);
  1075.             putc('\n', stderr);
  1076.             break;
  1077.     }
  1078.     if (key) {
  1079.         fprintf(stderr, "\tkey is %s justified, %s reversed and ",
  1080.           key_just==JLEFT ? "left" : "right",
  1081.           key_reverse ? "" : "not");
  1082.         if (key_box>=-2)
  1083.             fprintf(stderr, "boxed with linetype %d\n", key_box+1);
  1084.         else
  1085.             fprintf(stderr, "not boxed\n");
  1086.         fprintf(stderr, "\tkey title is \"%s\"\n", key_title);
  1087.     }
  1088. }
  1089.  
  1090. static void
  1091. show_parametric()
  1092. {
  1093.     fprintf(stderr,"\tparametric is %s\n",(parametric)? "ON" : "OFF");
  1094. }
  1095.  
  1096. static void
  1097. show_pointsize()
  1098. {
  1099.     fprintf(stderr, "\tpointsize is %g\n", pointsize);
  1100. }
  1101.  
  1102. static void
  1103. show_encoding()
  1104. {
  1105.     fprintf(stderr,"\tencoding is %s\n",encoding_names[encoding]);
  1106. }
  1107. static void
  1108. show_polar()
  1109. {
  1110.     fprintf(stderr,"\tpolar is %s\n",(polar)? "ON" : "OFF");
  1111. }
  1112.  
  1113. static void
  1114. show_angles()
  1115. {
  1116.     fprintf(stderr,"\tAngles are in ");
  1117.     switch (angles_format) {
  1118.         case ANGLES_RADIANS:
  1119.             fprintf(stderr, "radians\n");
  1120.         break;
  1121.         case ANGLES_DEGREES:
  1122.             fprintf(stderr, "degrees\n");
  1123.         break;
  1124.     }
  1125. }
  1126.  
  1127.  
  1128. static void
  1129. show_tics(showx, showy, showz,showx2, showy2)
  1130.     TBOOLEAN showx, showy, showz, showx2, showy2;
  1131. {
  1132.     fprintf(stderr,"\ttics are %s, ",(tic_in)? "IN" : "OUT");
  1133.     fprintf(stderr,"\tticslevel is %g\n",ticslevel);
  1134.     fprintf(stderr,"\tticscale is %g and miniticscale is %g\n",
  1135.       ticscale, miniticscale);
  1136.  
  1137.     if (showx)
  1138.      show_ticdef(xtics, FIRST_X_AXIS, &xticdef, "x");
  1139.     if (showx2)
  1140.      show_ticdef(x2tics, SECOND_X_AXIS, &x2ticdef, "second x");
  1141.     if (showy)
  1142.      show_ticdef(ytics, FIRST_Y_AXIS, &yticdef, "y");
  1143.     if (showy2)
  1144.      show_ticdef(y2tics, SECOND_Y_AXIS, &y2ticdef, "second y");
  1145.     if (showz)
  1146.      show_ticdef(ztics, FIRST_Z_AXIS, &zticdef, "z");
  1147.     screen_ok = FALSE;
  1148. }
  1149.  
  1150. /* called by show_tics */
  1151. static void
  1152. show_ticdef(tics, axis, tdef, text)
  1153.     int tics;            /* xtics ytics or ztics */
  1154.     int axis;
  1155.     struct ticdef *tdef;    /* xticdef yticdef or zticdef */
  1156.     char *text;  /* "x", ..., "x2", "y2" */
  1157. {
  1158.     register struct ticmark *t;
  1159.  
  1160.     fprintf(stderr, "\t%s-axis tic labelling is ", text);
  1161.     switch(tics & TICS_MASK) {
  1162.     case NO_TICS :        fprintf(stderr, "OFF\n"); return;
  1163.     case TICS_ON_AXIS :   fprintf(stderr, "on axis, "); break;
  1164.     case TICS_ON_BORDER : fprintf(stderr, "on border, "); break;
  1165.     }
  1166.  
  1167.     if (tics & TICS_MIRROR)
  1168.         fprintf(stderr, "mirrored on opposite border,\n\t");
  1169.  
  1170.     switch(tdef->type) {
  1171.        case TIC_COMPUTED: {
  1172.           fprintf(stderr, "computed automatically\n");
  1173.           break;
  1174.        }
  1175.         case TIC_MONTH: {
  1176.         fprintf(stderr, "Months computed automatically\n");
  1177.         break;
  1178.        }
  1179.         case TIC_DAY:{
  1180.         fprintf(stderr, "Days computed automatically\n");
  1181.         }
  1182.        case TIC_SERIES: {
  1183.            fprintf(stderr, "series");
  1184.            if (tdef->def.series.start != -VERYLARGE) {
  1185.                fprintf(stderr, " from ");
  1186.                SHOW_NUM_OR_TIME(tdef->def.series.start, axis);
  1187.            }
  1188.                
  1189.             fprintf(stderr, " by %g%s", tdef->def.series.incr, datatype[axis]==TIME ? " secs":"");
  1190.           if (tdef->def.series.end != VERYLARGE) {
  1191.               fprintf(stderr, " until ");
  1192.               SHOW_NUM_OR_TIME(tdef->def.series.end, axis);
  1193.           }
  1194.           putc('\n', stderr);
  1195.           break;
  1196.        }
  1197.        case TIC_USER: {
  1198.           int time;
  1199.           time = (datatype[axis] == TIME);
  1200.           fprintf(stderr, "list (");
  1201.           for (t = tdef->def.user; t != NULL; t=t->next) {
  1202.              if (t->label)
  1203.                 fprintf(stderr, "\"%s\" ", t->label);
  1204.              SHOW_NUM_OR_TIME(t->position, axis);
  1205.              if (t->next)
  1206.                 fprintf(stderr, ", ");
  1207.           }
  1208.           fprintf(stderr, ")\n");
  1209.           break;
  1210.        }
  1211.        default: {
  1212.           int_error("unknown ticdef type in show_ticdef()", NO_CARET);
  1213.           /* NOTREACHED */
  1214.        }
  1215.     }
  1216. }
  1217.  
  1218.  
  1219. static void
  1220. show_margin()
  1221. {
  1222.     if ( lmargin >= 0 )
  1223.         fprintf(stderr,"\tlmargin is set to %d\n", lmargin);
  1224.     else
  1225.         fprintf(stderr,"\tlmargin is computed automatically\n");
  1226.     if ( bmargin >= 0 )
  1227.         fprintf(stderr,"\tbmargin is set to %d\n", bmargin);
  1228.     else
  1229.         fprintf(stderr,"\tbmargin is computed automatically\n");
  1230.     if ( rmargin >= 0 )
  1231.         fprintf(stderr,"\trmargin is set to %d\n", rmargin);
  1232.     else
  1233.         fprintf(stderr,"\trmargin is computed automatically\n");
  1234.     if ( tmargin >= 0 )
  1235.         fprintf(stderr,"\ttmargin is set to %d\n", tmargin);
  1236.     else
  1237.         fprintf(stderr,"\ttmargin is computed automatically\n");
  1238. }
  1239.  
  1240. static void
  1241. show_term()
  1242. {
  1243.     if (term)
  1244.         fprintf(stderr,"\tterminal type is %s %s\n",
  1245.             term->name, term_options);
  1246.     else
  1247.         fprintf(stderr,"\tterminal type is unknown\n");
  1248. }
  1249.  
  1250. static void
  1251. show_plot()
  1252. {
  1253.     fprintf(stderr,"\tlast plot command was: %s\n",replot_line);
  1254. }
  1255.  
  1256. static void
  1257. show_autoscale()
  1258. {
  1259.     fprintf(stderr,"\tautoscaling is ");
  1260.     if (parametric) {
  1261.         if (is_3d_plot) {
  1262.             fprintf(stderr,"\tt: %s%s%s, ",
  1263.                 (autoscale_t)? "ON" : "OFF",
  1264.                 (autoscale_t == 1)? " (min)":"",
  1265.                 (autoscale_t == 2)? " (max)":"");
  1266.         } else {
  1267.             fprintf(stderr,"\tu: %s%s%s, ",
  1268.                 (autoscale_u)? "ON" : "OFF",
  1269.                 (autoscale_u == 1)? " (min)":"",
  1270.                 (autoscale_u == 2)? " (max)":"");
  1271.             fprintf(stderr,"v: %s%s%s, ",
  1272.                 (autoscale_v)? "ON" : "OFF",
  1273.                 (autoscale_v == 1)? " (min)":"",
  1274.                 (autoscale_v == 2)? " (max)":"");
  1275.         }
  1276.     } else fprintf(stderr,"\t");
  1277.  
  1278.     if (polar) {
  1279.         fprintf(stderr,"r: %s%s%s, ",(autoscale_r)? "ON" : "OFF",
  1280.                 (autoscale_r == 1)? " (min)":"",
  1281.                 (autoscale_r == 2)? " (max)":"");
  1282.     }
  1283.     fprintf(stderr,"x: %s%s%s, ",(autoscale_x)? "ON" : "OFF",
  1284.                 (autoscale_x == 1)? " (min)":"",
  1285.                 (autoscale_x == 2)? " (max)":"");
  1286.     fprintf(stderr,"y: %s%s%s, ",(autoscale_y)? "ON" : "OFF",
  1287.                 (autoscale_y == 1)? " (min)":"",
  1288.                 (autoscale_y == 2)? " (max)":"");
  1289.     fprintf(stderr,"z: %s%s%s\n",(autoscale_z)? "ON" : "OFF",
  1290.                 (autoscale_z == 1)? " (min)":"",
  1291.                 (autoscale_z == 2)? " (max)":"");
  1292. }
  1293.  
  1294. static void
  1295. show_clip()
  1296. {
  1297.     fprintf(stderr,"\tpoint clip is %s\n",(clip_points)? "ON" : "OFF");
  1298.  
  1299.     if (clip_lines1)
  1300.       fprintf(stderr,
  1301.          "\tdrawing and clipping lines between inrange and outrange points\n");
  1302.     else
  1303.       fprintf(stderr,
  1304.          "\tnot drawing lines between inrange and outrange points\n");
  1305.  
  1306.     if (clip_lines2)
  1307.       fprintf(stderr,
  1308.          "\tdrawing and clipping lines between two outrange points\n");
  1309.     else
  1310.       fprintf(stderr,
  1311.          "\tnot drawing lines between two outrange points\n");
  1312. }
  1313.  
  1314. static void
  1315. show_mapping()
  1316. {
  1317.     fprintf(stderr,"\tmapping for 3-d data is ");
  1318.  
  1319.     switch (mapping3d) {
  1320.         case MAP3D_CARTESIAN:
  1321.             fprintf(stderr,"cartesian\n");
  1322.             break;
  1323.         case MAP3D_SPHERICAL:
  1324.             fprintf(stderr,"spherical\n");
  1325.             break;
  1326.         case MAP3D_CYLINDRICAL:
  1327.             fprintf(stderr,"cylindrical\n");
  1328.             break;
  1329.     }
  1330. }
  1331.  
  1332. static void
  1333. show_contour()
  1334. {
  1335.     fprintf(stderr,"\tcontour for surfaces are %s",
  1336.         (draw_contour)? "drawn" : "not drawn\n");
  1337.  
  1338.     if (draw_contour) {
  1339.             fprintf(stderr, " in %d levels on ", contour_levels);
  1340.         switch (draw_contour) {
  1341.             case CONTOUR_BASE:
  1342.                 fprintf(stderr,"grid base\n");
  1343.                 break;
  1344.             case CONTOUR_SRF:
  1345.                 fprintf(stderr,"surface\n");
  1346.                 break;
  1347.             case CONTOUR_BOTH:
  1348.                 fprintf(stderr,"grid base and surface\n");
  1349.                 break;
  1350.         }
  1351.         switch (contour_kind) {
  1352.             case CONTOUR_KIND_LINEAR:
  1353.                 fprintf(stderr,"\t\tas linear segments\n");
  1354.                 break;
  1355.             case CONTOUR_KIND_CUBIC_SPL:
  1356.                 fprintf(stderr,"\t\tas cubic spline interpolation segments with %d pts\n",
  1357.                     contour_pts);
  1358.                 break;
  1359.             case CONTOUR_KIND_BSPLINE:
  1360.                 fprintf(stderr,"\t\tas bspline approximation segments of order %d with %d pts\n",
  1361.                     contour_order, contour_pts);
  1362.                 break;
  1363.         }
  1364.         switch (levels_kind) {
  1365.             case LEVELS_AUTO:
  1366.                 fprintf(stderr,"\t\t%d automatic levels\n", contour_levels);
  1367.                 break;
  1368.             case LEVELS_DISCRETE:
  1369.             {    int i;
  1370.                 fprintf(stderr,"\t\t%d discrete levels at ", contour_levels);
  1371.                 fprintf(stderr, "%g", levels_list[0]);
  1372.                 for(i = 1; i < contour_levels; i++)
  1373.                     fprintf(stderr,",%g ", levels_list[i]);
  1374.                 fprintf(stderr,"\n");
  1375.                 break;
  1376.             }
  1377.             case LEVELS_INCREMENTAL:
  1378.                 fprintf(stderr,"\t\t%d incremental levels starting at %g, step %g, end %g\n",
  1379.                     contour_levels, levels_list[0], levels_list[1],
  1380.                     levels_list[0]+contour_levels*levels_list[1]);
  1381.                 break;
  1382.         }
  1383.         /* fprintf(stderr,"\t\tcontour line types are %s\n", label_contours ? "varied" : "all the same"); */
  1384.         show_label_contours();
  1385.     }
  1386. }
  1387.  
  1388. static void
  1389. show_format()
  1390. {
  1391.     char str[5][MAX_LINE_LEN+1];
  1392.  
  1393.     fprintf(stderr, "\ttic format is x-axis: \"%s\", y-axis: \"%s\", z-axis: \"%s\", x2-axis: \"%s\", y2-axis: \"%s\"\n",
  1394.         conv_text(str[0],xformat), conv_text(str[1],yformat), conv_text(str[2],zformat), conv_text(str[3], x2format), conv_text(str[4], y2format));
  1395. }
  1396.  
  1397. #define SHOW_LOG(FLAG, BASE, TEXT) \
  1398. if (FLAG) fprintf(stderr, "%s %s (base %g)", !count++ ? "\tlogscaling" : " and", TEXT,BASE)
  1399.  
  1400. static void
  1401. show_logscale()
  1402. {
  1403.     int count=0;
  1404.  
  1405.     SHOW_LOG(is_log_x, base_log_x, "x");
  1406.     SHOW_LOG(is_log_y, base_log_y, "y");
  1407.     SHOW_LOG(is_log_z, base_log_z, "z");
  1408.     SHOW_LOG(is_log_x2, base_log_x2, "x2");
  1409.     SHOW_LOG(is_log_y2, base_log_y2, "y2");
  1410.  
  1411.     if (count==0)
  1412.         fputs("\tno logscaling\n", stderr);
  1413.     else if (count==1)
  1414.         fputs(" only\n", stderr);
  1415.     else
  1416.         putc('\n', stderr);
  1417. }
  1418.  
  1419. static void
  1420. show_variables()
  1421. {
  1422. register struct udvt_entry *udv = first_udv;
  1423. int len;
  1424.  
  1425.     fprintf(stderr,"\n\tVariables:\n");
  1426.     while (udv) {
  1427.          len = instring(udv->udv_name, ' ');
  1428.         fprintf(stderr,"\t%-*s ",len,udv->udv_name);
  1429.         if (udv->udv_undef)
  1430.             fputs("is undefined\n",stderr);
  1431.         else {
  1432.             fputs("= ",stderr);
  1433.             disp_value(stderr,&(udv->udv_value));
  1434.             (void) putc('\n',stderr);
  1435.         }
  1436.         udv = udv->next_udv;
  1437.     }
  1438. }
  1439.  
  1440. void                /* used by plot.c */
  1441. show_version()
  1442. {
  1443. extern char version[];
  1444. extern char patchlevel[];
  1445. extern char date[];
  1446. extern char copyright[];
  1447. extern char bug_email[];
  1448. extern char help_email[];
  1449.  
  1450.     fprintf(stderr, "\n\t%s\n\t%sversion %s\n",
  1451.         PROGRAM, OS, version); 
  1452.     fprintf(stderr, "\tpatchlevel %s\n",patchlevel);
  1453.     fprintf(stderr, "\tlast modified %s\n", date);
  1454.     fprintf(stderr,"\n\t%s", copyright);
  1455.     fprintf(stderr, "\n\tThomas Williams, Colin Kelley and many others");
  1456.     fprintf(stderr, "\n");
  1457.     fprintf(stderr, "\n\tSend comments and requests for help to %s", help_email);
  1458.     fprintf(stderr, "\n\tSend bugs, suggestions and mods to %s\n", bug_email);
  1459. }
  1460.  
  1461. static void
  1462. show_datatype(axis)
  1463. int axis;
  1464. {
  1465.     int i;
  1466.     char tt[8];
  1467.     strcpy(tt,"xyz");
  1468.     if ( axis == '9' ) {
  1469.         /* scan datatype[] for TIME type */
  1470.         for (i=0;i<3;i++){
  1471.             if ( datatype[i] == TIME ) {
  1472.                 fprintf(stderr,"%cdata is set to time\n",tt[i]);
  1473.             }
  1474.         }
  1475.     } else if ( axis < 3 ) {
  1476.         if ( datatype[axis] == TIME ) {
  1477.             fprintf(stderr,"%cdata is set to time\n",tt[axis]);
  1478.         }
  1479.     }
  1480. }
  1481.  
  1482. char *
  1483. conv_text(s,t)
  1484. char *s, *t;
  1485. {
  1486.     /* convert unprintable characters as \okt, tab as \t, newline \n .. */
  1487.     char *r;
  1488.     r = s;
  1489.     while (*t != '\0' ) {
  1490.         switch ( *t ) {
  1491.             case '\t' :
  1492.                 *s++ = '\\';
  1493.                 *s++ = 't';
  1494.                 break;
  1495.             case '\n' :
  1496.                 *s++ = '\\';
  1497.                 *s++ = 'n';
  1498.                 break;
  1499. #ifndef OSK
  1500.             case '\r' :
  1501.                 *s++ = '\\';
  1502.                 *s++ = 'r';
  1503.                 break;
  1504. #endif
  1505.             case '"' :
  1506.             case '\\':
  1507.                 *s++ = '\\';
  1508.                 *s++ = *t;
  1509.                 break;
  1510.                 
  1511.             default: {
  1512.                 if ( (*t & 0177) > 31 && (*t & 0177) < 127 ) 
  1513.                     *s++ = *t;
  1514.                 else {
  1515.                     *s++ = '\\';
  1516.                     sprintf(s,"%o",*t);
  1517.                     while ( *s != '\0' ) s++;
  1518.                 }
  1519.             }
  1520.         }
  1521.         t++;
  1522.     }
  1523.     *s = '\0';
  1524.     return(r);
  1525. }
  1526.  
  1527.  
  1528. static void show_position(pos)
  1529. struct position *pos;
  1530. {
  1531.     static char *msg[]={"(first axes) ","(second axes) ", "(graph units) ", "(screen units) "};
  1532.  
  1533.     assert(first_axes==0 && second_axes==1 && graph==2 && screen==3);
  1534.     
  1535.     fprintf(stderr, "(%s%g, %s%g, %s%g)",
  1536.         pos->scalex == first_axes  ? "" : msg[pos->scalex], pos->x,
  1537.         pos->scaley == pos->scalex ? "" : msg[pos->scaley], pos->y,
  1538.         pos->scalez == pos->scaley ? "" : msg[pos->scalez], pos->z);
  1539.  
  1540. }
  1541.  
  1542. static void
  1543. show_missing()
  1544. {
  1545.     if ( missing_val == NULL )
  1546.         fprintf(stderr,"\tNo string is interpreted as missing data\n");
  1547.     else
  1548.         fprintf(stderr,"\t\"%s\" is interpreted as missing value\n",missing_val);
  1549. }
  1550.